package br.com.future.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import org.apache.log4j.Logger;

import br.com.future.dao.interfaces.RelatorioDAOI;
import br.com.future.jdbc.ConnectionFactory;
import br.com.future.log4j.Log4j;
import br.com.future.model.Advogado;
import br.com.future.model.AdvogadoProcesso;
import br.com.future.model.Cliente;
import br.com.future.model.Processo;
import br.com.future.model.TipoCausa;
import br.com.future.model.TipoCobranca;

public class RelatorioDAO implements RelatorioDAOI{

	//chamando o metodo da classe Log4j.
	static Logger logger = Logger.getLogger(Log4j.class);
	
	private static Connection conn = null;
	private static boolean flag = true;
	
	public RelatorioDAO(Connection conn){
		RelatorioDAO.conn = conn;
	}
	public RelatorioDAO(){
		
	}
	
	public List<AdvogadoProcesso> consultaProcPorAdvogado(Long numOAB){
		
		conn = ConnectionFactory.getConnection();
		
		ResultSet rs = null;
		PreparedStatement ps = null;
		List<AdvogadoProcesso> listaAdvProc = new ArrayList<AdvogadoProcesso>();
		
		String sql = "SELECT PESSOA.NM_PESSOA,ADVPROCESSO.CD_PESSOA_ADV,CAUSA.CD_CAUSA," +
					 "	PROCESSO.NR_PROCESSO,PROCESSO.DS_PROCESSO,PROCESSO.DT_ABERTURA,PROCESSO.DT_FECHAMENTO," +
					 "	ADVPROCESSO.DT_INICIO_PARTICIPACAO,CAUSA.DS_CAUSA,PROCESSO.CD_RESULTADO" +
					 "	FROM AM_ADVOGADO ADV" +
					 "	LEFT JOIN AM_ADVOGADO_PROCESSO ADVPROCESSO ON" +
					 "		ADVPROCESSO.CD_PESSOA_ADV = ADV.CD_PESSOA_ADV " +
					 "	LEFT JOIN AM_PESSOA PESSOA ON" +
					 "		ADV.CD_PESSOA_ADV = PESSOA.CD_PESSOA" +
					 "	LEFT JOIN AM_PROCESSO PROCESSO ON" +
					 "		ADVPROCESSO.NR_PROCESSO = PROCESSO.NR_PROCESSO" +
					 "	LEFT JOIN AM_TIPO_CAUSA CAUSA ON" +
					 "		PROCESSO.CD_CAUSA = CAUSA.CD_CAUSA" +
					 "	WHERE ADV.NR_OAB = ?";
		
		try {
			
			ps = conn.prepareStatement(sql);
			ps.setLong(1, numOAB);
			rs = ps.executeQuery();
			
			Advogado advogado = new Advogado();
			
			while(rs.next()){
				
				Processo processo = new Processo();
				AdvogadoProcesso advproc = new AdvogadoProcesso();
				TipoCausa tipoCausa = new TipoCausa();
				
				tipoCausa.setCodigo(rs.getInt("CD_CAUSA"));
				tipoCausa.setDescricaoCausa(rs.getString("DS_CAUSA"));
				
				Calendar dataFechamento = Calendar.getInstance();
				Calendar dataAbertura = Calendar.getInstance();
				Calendar dataParticipacao = Calendar.getInstance();
				
				if(rs.getDate("DT_ABERTURA") != null){
					dataAbertura.setTime(rs.getDate("DT_ABERTURA"));
					processo.setDataAbertura(dataAbertura);
				}
				
				if(rs.getDate("DT_FECHAMENTO") != null){
					dataFechamento.setTime(rs.getDate("DT_FECHAMENTO"));
					processo.setDataFechamento(dataFechamento);
				}
				
				processo.setNumeroProcesso(rs.getLong("NR_PROCESSO"));
				processo.setDescricaoProcesso(rs.getString("DS_PROCESSO"));
				processo.setTipoCausa(tipoCausa);
				processo.setResultadoProcesso(rs.getInt("CD_RESULTADO"));
				
				advogado.setCodigoPessoa(rs.getInt("CD_PESSOA_ADV"));
				advogado.setNomePessoa(rs.getString("NM_PESSOA"));
				
				if(rs.getDate("DT_INICIO_PARTICIPACAO") != null){
					dataParticipacao.setTime(rs.getDate("DT_INICIO_PARTICIPACAO"));
					advproc.setDataInicioParticipacao(dataParticipacao);
				}
				
				advproc.setAdvogado(advogado);
				advproc.setProcesso(processo);
				
				listaAdvProc.add(advproc);
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
			//chamando a mensagem.
			logger.error(e.getMessage());
		}finally{
			if(flag){
				ConnectionFactory.closeConnectionOracle(conn, rs, ps);
			}
		}
		
		return listaAdvProc;
	}
	
	@Override
	public List<Processo> consultaProcPorPeriodo(Calendar dataInicio, Calendar dataFinal){
		
		ResultSet rs = null;
		PreparedStatement ps = null;
		List<Processo> listaProcessos = new ArrayList<Processo>();
		conn = ConnectionFactory.getConnection();
		
		TelefoneDAO telefoneDao = new TelefoneDAO(conn);
		AdvogadoDAO advogadoDAO = new AdvogadoDAO(conn);

		Calendar dataAbertura = Calendar.getInstance();
		
		try{
			String sql = "SELECT PROCESSO.NR_PROCESSO,PROCESSO.DS_PROCESSO,PROCESSO.DT_ABERTURA,CLIENTE.CD_PESSOA_CLIENTE," +
						 " 	 	 CLIENTE.NM_RAZAO_SOCIAL,CAUSA.CD_CAUSA,CAUSA.DS_CAUSA" +
						 " FROM AM_PROCESSO PROCESSO" +
						 "	 INNER JOIN AM_TIPO_CAUSA CAUSA ON" +
						 " 		CAUSA.CD_CAUSA = PROCESSO.CD_CAUSA" +
						 "	 INNER JOIN AM_CLIENTE CLIENTE ON" +
						 "	 	CLIENTE.CD_PESSOA_CLIENTE = PROCESSO.CD_PESSOA_CLIENTE" +
						 " WHERE PROCESSO.DT_ABERTURA BETWEEN ? AND ?";
			
			ps = conn.prepareStatement(sql);
			ps.setDate(1, new java.sql.Date(dataInicio.getTimeInMillis()));
			ps.setDate(2, new java.sql.Date(dataFinal.getTimeInMillis()));
			rs = ps.executeQuery();
			
			
			while (rs.next()){
				
				Processo processo = new Processo();
				Cliente cliente = new Cliente();
				TipoCausa causa = new TipoCausa();
				
				processo.setNumeroProcesso(rs.getLong("NR_PROCESSO"));
				processo.setDescricaoProcesso(rs.getString("DS_PROCESSO"));
				
				processo.setAdvogados(advogadoDAO.consultarProcessoAdvogado(rs.getLong("NR_PROCESSO")));
				
				causa.setCodigo(rs.getInt("CD_CAUSA"));
				causa.setDescricaoCausa(rs.getString("DS_CAUSA"));
				
				processo.setTipoCausa(causa);
				
				cliente.setCodigoPessoa(rs.getInt("CD_PESSOA_CLIENTE"));
				cliente.setNomePessoa(rs.getString("NM_RAZAO_SOCIAL"));
				cliente.setTelefones(telefoneDao.consultarPorCodigoPessoa(rs.getInt("CD_PESSOA_CLIENTE")));
				
				processo.setCliente(cliente);
				
				if(rs.getDate("DT_ABERTURA") != null){
					dataAbertura.setTime(rs.getDate("DT_ABERTURA"));
					processo.setDataAbertura(dataAbertura);
				}
				
				processo.setAdvogados(advogadoDAO.consultarProcessoAdvogado(rs.getLong("NR_PROCESSO")));
				listaProcessos.add(processo);
			}
			
		}catch(SQLException e){
			e.printStackTrace();
			//chamando a mensagem.
			logger.error(e.getMessage());
		}finally{
			if(flag){
				ConnectionFactory.closeConnectionOracle(conn, rs, ps);
			}
		}
		
		return listaProcessos;
	}
	
	public Cliente consultaProcPorCliente(int codCliente){
		
		conn = ConnectionFactory.getConnection();
		
		ResultSet rs = null;
		PreparedStatement ps = null;
		
		Cliente cliente = new Cliente();
		List<Processo> processos = new ArrayList<Processo>();
		AdvogadoDAO advogadoDAO = new AdvogadoDAO(conn);
		
		String sql = "SELECT PROCESSO.NR_PROCESSO, CLIENTE.NM_RAZAO_SOCIAL, CLIENTE.CD_PESSOA_CLIENTE,PROCESSO.DS_PROCESSO," +
							" PROCESSO.DT_ABERTURA,PROCESSO.DT_FECHAMENTO, "+ 
						 	" CAUSA.CD_CAUSA,CAUSA.DS_CAUSA,COBRANCA.CD_COBRANCA,COBRANCA.DS_COBRANCA, "+
						 	" PROCESSO.DD_DIA_VENCIMENTO,PROCESSO.CD_RESULTADO "+
						" FROM AM_CLIENTE CLIENTE "+
						" LEFT JOIN AM_PROCESSO PROCESSO ON "+
						"	PROCESSO.CD_PESSOA_CLIENTE = CLIENTE.CD_PESSOA_CLIENTE "+
						" LEFT JOIN AM_TIPO_CAUSA CAUSA ON "+
						"	PROCESSO.CD_CAUSA = CAUSA.CD_CAUSA "+ 
						" LEFT JOIN AM_TIPO_COBRANCA COBRANCA ON "+
						"	PROCESSO.CD_COBRANCA = COBRANCA.CD_COBRANCA " +
						" WHERE CLIENTE.CD_PESSOA_CLIENTE = ?";
		
		try {
			ps = conn.prepareStatement(sql);
			ps.setInt(1, codCliente);
			rs = ps.executeQuery();
			
			while(rs.next()){
				if(rs.isFirst()){
					cliente.setCodigoPessoa(rs.getInt("CD_PESSOA_CLIENTE"));
					cliente.setNomePessoa(rs.getString("NM_RAZAO_SOCIAL"));
					//Pessoa pessoa = new PessoaDAO().consultar(rs.getInt("CD_PESSOA_CLIENTE"));
					//Cliente clienteRecuperado = new ClienteDAO().consultar(rs.getInt("CD_PESSOA_CLIENTE"));
					//System.out.println(clienteRecuperado.getCnpj());
					//cliente.setCodigoPessoa(rs.getInt("CD_PESSOA_CLIENTE"));;
					//cliente.setCnpj(clienteRecuperado.getCnpj());
					//cliente.setEmail(clienteRecuperado.getEmail());
					//cliente.setInscEstadual(clienteRecuperado.getInscEstadual());
					//cliente.setNomePessoa(pessoa.getNomePessoa());
				}
				
				Processo processo = new Processo();
				processo.setNumeroProcesso(rs.getLong("NR_PROCESSO"));
				processo.setDescricaoProcesso(rs.getString("DS_PROCESSO"));
				TipoCausa causa = new TipoCausa();
				TipoCobranca cobranca = new TipoCobranca();
				
				processo.setAdvogados(advogadoDAO.consultarProcessoAdvogado(rs.getLong("NR_PROCESSO")));
				
				causa.setCodigo(rs.getInt("CD_CAUSA"));
				causa.setDescricaoCausa(rs.getString("DS_CAUSA"));
				
				cobranca.setCodigoCobranca(rs.getInt("CD_COBRANCA"));
				cobranca.setDescricaoCobranca(rs.getString("DS_COBRANCA"));
				
				Calendar dataFechamento = Calendar.getInstance();
				Calendar dataAbertura = Calendar.getInstance();
				
				processo.setTipoCausa(causa);
				processo.setTipoCobranca(cobranca);
				
				processo.setDiaVencimento(rs.getInt("DD_DIA_VENCIMENTO"));
				
				dataAbertura.setTime(rs.getDate("DT_ABERTURA"));
				processo.setDataAbertura(dataAbertura);
				if(rs.getDate("DT_FECHAMENTO") != null){
					dataFechamento.setTime(rs.getDate("DT_FECHAMENTO"));
					processo.setDataFechamento(dataFechamento);
				}
				
				processo.setResultadoProcesso(rs.getInt("CD_RESULTADO"));
				
				processos.add(processo);
				
			}
			cliente.setProcessos(processos);
			
		} catch (SQLException e) {
			e.printStackTrace();
			//chamando a mensagem.
			logger.error(e.getMessage());
		}finally{
			if(flag){
				ConnectionFactory.closeConnectionOracle(conn, rs, ps);
			}
		}
		
		return cliente;
	}
}
